home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #3 & #4 / Amiga Plus CD - 1995 - No. 3 and 4.iso / pd / sound / cybersound / 14bit.driver / source / asmsupport.asm next >
Assembly Source File  |  1995-07-20  |  5KB  |  230 lines

  1. *****************************************************************************
  2. *
  3. * CyberSound: 14 Bit sound driver
  4. *
  5. * (c) 1995 by Christian Buchner
  6. *
  7. *****************************************************************************
  8. *
  9. * AsmSupport.asm
  10. *
  11.  
  12.         SECTION    Code,CODE
  13.  
  14.  
  15. * _CreateTable **************************************************************
  16.  
  17.         ; Parameters
  18.  
  19.         ; a0 = Table address
  20.         ; (MUST have enough space for 65536 UWORDS)
  21.         ; a1 = Additive Array
  22.         ; 256 UBYTEs
  23.         ;
  24.         ; the table is organized as follows:
  25.         ; 32768 UWORDS positive range, ascending order
  26.         ; 32768 UWORDS negative range, ascending order
  27.         ; access: (a0,d0.l*2)
  28.         ; where d0.w is signed word sample data
  29.         ; and the upper word of d0.l is *cleared!*
  30.  
  31.  
  32.         XDEF    _CreateTable
  33.  
  34. _CreateTable    movem.l    a2/d2-d6,-(sp)
  35.  
  36.         lea    128(a1),a2
  37.  
  38.         move.l    a2,a1            ; count the number of steps
  39.         moveq    #128-1,d0        ; in the positive range
  40.         moveq    #0,d5
  41. .countpositive    move.b    (a1)+,d1
  42.         ext.w    d1
  43.         ext.l    d1
  44.         add.l    d1,d5
  45.         dbra    d0,.countpositive    ; d5=number of steps
  46.         move.l    #32768,d6        ; reset stretch counter
  47.         
  48.         move.l    a2,a1            ; middle value in calibdata
  49.         move.w    #32768-1,d0        ; number of positive values -1
  50.         moveq    #0,d1            ; HI value
  51.         moveq    #0,d2            ; LO value
  52.         moveq    #0,d3            ; counter
  53. .fetchnext2    move.b    (a1)+,d4        ; add calibtable to counter
  54.         ext.w    d4
  55.         add.w    d4,d3
  56. .outerloop2    tst.w    d3
  57.         bgt.s    .positive2
  58. .negative2    addq.w    #1,d1            ; increment HI value
  59.         sub.w    d4,d2            ; reset LO value
  60.         bra.s    .fetchnext2
  61. .positive2    move.b    d1,(a0)+        ; store HI and LO value
  62.         move.b    d2,(a0)+
  63.         sub.l    d5,d6            ; stretch the table
  64.         bpl.s    .repeat2        ; to 32768 entries
  65.         add.l    #32768,d6
  66.         addq.w    #1,d2            ; increment LO value
  67.         subq.w    #1,d3            ; decrement counter
  68. .repeat2    dbra    d0,.outerloop2
  69.  
  70.         move.l    a2,a1            ; count the number of steps
  71.         moveq    #128-1,d0        ; in the negative range
  72.         moveq    #0,d5
  73. .countnegative    move.b    -(a1),d1
  74.         ext.w    d1
  75.         ext.l    d1
  76.         add.l    d1,d5
  77.         dbra    d0,.countnegative    ; d5=number of steps
  78.         move.l    #32768,d6        ; reset stretch counter
  79.         
  80.         add.l    #2*32768,a0        ; place at the end of the table
  81.         move.l    a2,a1            ; middle value in calibdata
  82.         move.w    #32768-1,d0        ; number of negative values -1
  83.         moveq    #-1,d1            ; HI value
  84.         moveq    #-1,d2            ; LO value
  85.         moveq    #0,d3            ; counter
  86. .fetchnext1    move.b    -(a1),d4        ; add calibtable to counter
  87.         ext.w    d4
  88.         add.w    d4,d3
  89.         add.w    d4,d2            ; maximize LO value
  90. .outerloop1    tst.w    d3
  91.         bgt.s    .positive1
  92. .negative1    subq.w    #1,d1
  93.         bra.s    .fetchnext1
  94. .positive1    move.b    d2,-(a0)        ; store LO and HI value
  95.         move.b    d1,-(a0)
  96.         sub.l    d5,d6            ; stretch the table
  97.         bpl.s    .repeat1        ; to 32768 entries
  98.         add.l    #32768,d6
  99.         subq.w    #1,d2            ; decrement lo value
  100.         subq.w    #1,d3            ; decrement counter
  101. .repeat1    dbra    d0,.outerloop1
  102.  
  103.         movem.l    (sp)+,a2/d2-d6
  104.         rts
  105.  
  106.  
  107. * _ConvertStream *************************************************************
  108.  
  109.         ; Parameters
  110.  
  111.         ; a0=Stream pointer
  112.         ; a1=MSB channel
  113.         ; a2=LSB channel
  114.         ; a3=Table address
  115.         ; d0=samples
  116.         ; d1=interleave
  117.  
  118.         XDEF    _ConvertStream
  119.  
  120. _ConvertStream    movem.l    d2/d3/d4/a2/a3,-(sp)
  121.  
  122.         addq.w    #1,d1            ; calc byte distance
  123.         add.w    d1,d1            ; between 16 bit samples
  124.  
  125.         moveq    #0,d2            ; clear d2 LONGWORD
  126.  
  127.         ; This first loop minimizes access to chip RAM
  128.         ; by creating ULONGs
  129.  
  130.         move.w    d0,-(sp)        ; store samples
  131.         lsr.l    #2,d0            ; calc samples/4
  132.         bra.s    .convertentry        ; enter loop
  133. .convertHI    swap    d0
  134.  
  135. .convertLO    move.w    (a0),d2            ; get 16 bit data
  136.         add.w    d1,a0            ; interleave
  137.  
  138.         move.w    (a3,d2.l*2),d3        ; get high/low byte
  139.         move.b    d3,d4
  140.         rol.w    #8,d4            ; shift left
  141.  
  142.         ; d3: ---- ---- 1111 ----
  143.         ; d4: ---- ---- 1111 ----
  144.  
  145.         move.w    (a0),d2            ; get 16 bit data
  146.         add.w    d1,a0            ; interleave
  147.  
  148.         move.b    (a3,d2.l*2),d3        ; get high byte
  149.         swap    d3            ; swap ULONG
  150.         move.b    1(a3,d2.l*2),d4        ; get low byte
  151.         swap    d4            ; swap ULONG
  152.  
  153.         ; d3: 1111 2222 ---- ----
  154.         ; d4: 1111 2222 ---- ----
  155.  
  156.         move.w    (a0),d2            ; get 16 bit data
  157.         add.w    d1,a0            ; interleave
  158.  
  159.         move.w    (a3,d2.l*2),d3        ; get high/low byte
  160.         move.b    d3,d4
  161.         rol.w    #8,d4
  162.         
  163.         ; d3: 1111 2222 3333 ----
  164.         ; d4: 1111 2222 3333 ----
  165.  
  166.         move.w    (a0),d2            ; get 16 bit data
  167.         add.w    d1,a0            ; interleave
  168.  
  169.         move.b    (a3,d2.l*2),d3        ; get high byte
  170.         move.l    d3,(a1)+        ; store 4 high bytes
  171.         move.b    1(a3,d2.l*2),d4        ; get low byte
  172.         move.l    d4,(a2)+        ; store 4 low bytes
  173.  
  174.         ; d3: 1111 2222 3333 4444
  175.         ; d4: 1111 2222 3333 4444
  176.  
  177. .convertentry    dbra    d0,.convertLO        ; loop back
  178.         swap    d0
  179.         dbra    d0,.convertHI
  180.  
  181.         move.w    (sp)+,d0        ; restore samples
  182.         and.w    #$3,d0            ; calculate samples MOD 3
  183.         bra.s    .restentry        ; enter loop
  184.  
  185. .restLO        move.w    (a0),d2            ; get 16 bit data
  186.         add.w    d1,a0            ; interleave
  187.  
  188.         move.b    (a3,d2.l*2),(a1)+    ; store high byte
  189.         move.b    1(a3,d2.l*2),(a2)+    ; store low byte
  190.  
  191. .restentry     dbra    d0,.restLO        ; loop back
  192.  
  193.         movem.l    (sp)+,d2/d3/d4/a2/a3
  194.         rts
  195.  
  196.  
  197. * _SwapEndian *****************************************************************
  198.  
  199.         ; Parameters
  200.  
  201.         ; a0=Table pointer
  202.  
  203.         XDEF    _SwapEndian
  204.  
  205. _SwapEndian    movem.l    d2/d3,-(sp)
  206.         
  207.         move.w    #65535,d0        ; loop 65536 UWORDs
  208.         moveq    #0,d1            ; start offset = 0
  209.  
  210. .loop        move.l    d1,d2            ; calculate swap offset
  211.         rol.w    #8,d2            ; swap big<->little endian
  212.  
  213.         cmp.l    d1,d2            ; only swap if one is lower
  214.         bhs.s    .skip
  215.  
  216.         move.w    (a0,d1.l*2),d3        ; swap the table entries
  217.         move.w    (a0,d2.l*2),(a0,d1.l*2)
  218.         move.w    d3,(a0,d2.l*2)
  219.  
  220. .skip        addq.l    #1,d1            ; increment offset
  221.         dbra    d0,.loop        ; loop back
  222.  
  223.         movem.l    (sp)+,d2/d3
  224.         rts
  225.  
  226.  
  227. ******************************************************************************
  228.  
  229.         END
  230.